
What does our data look like?
The data I used in the project is from Happy DB, which contains more than 100,000 happy moments text data. Here is a brief summary of our dataset. In addition to the text data, it is also possible also get many useful information such as gender, marital status, reflection period and more. In this project, I will mainly focus on the same points and differences of happy moments of different gender. The chart below is a small piece of our dataset after reordering columns.
This is a brief statistics report of the data I am trying to manipulate with. The number of male is more than female, and among different marital status, the two dominate classes are married and single.
| |
divorced |
married |
separated |
single |
widowed |
Sum |
| f |
2325 |
20224 |
511 |
18528 |
356 |
41944 |
| m |
1456 |
20767 |
119 |
35084 |
120 |
57546 |
| Sum |
3781 |
40991 |
630 |
53612 |
476 |
99490 |
Why women and men are feeling happy?
According to the barplots, women are more likely to feel happy about things related to affection and men are more willing to cheer their achievements.

By comparing the two more detailed plots, I found something interesting about the things that can cheer men and women up in their different marital status. For example, married men and single men have huge difference in their happy moments, single men are happy about achievement way more than affection, however once men getting married, they obviously spend more time on family and feel happy about it. One interesting thing is that, women always would like to share or feel happy about things related to affection no matter she is single or married. Though, married women do spend much more time on things related to affection than single. As for widowed, separated and divorced female and male, affection part is the most siginificant.


What words do they use?
In order to get a brief sense of what women and men are saying in their happy moments, I draw 2 word cloud figures to make things clear. Here, word capital word “F” represents female and “M” represents male. By looking at the word cloud of women, it is easy to notice that there are lots of words related to family and life.
The most used words in men’s happy moment are not so focused on family matters. There are more words related to game and occupation.
Does marital status affect the way men and women feel happy?
I made the word frequence plots and tfidf plots to show whether marital status has any effect on happy moment.




What are they feeling happy about?
The topic numbers I put into LDA is K=21. The reason why I choose this number is that we already have seven rough catagories in the dataset and I suppose that there will be 3 subtle catagories in each rough catagory, then the total number of topics would be 21.


There are some interesting points, in male topic 6, 7 and 8 are about game, exercise and job, which any of these topics are hard to match in female topics. In male topic 11 and 13, words show that things are related to school and work, which could match female topic 12 and 15. Women are more likely to have happy moments with family, and they are more sensetive to the “small” things happened in their life. Compared to women, men are not that much like to feel, or at least to share their happy moments with family. Not like women, men are more likely to feel happy about their job, school and exercise in gym (achievements).
Who is similar to whom?
After all the analysis of difference between men and women, I can now use clustering method to see if among all the marital status of men and women, who is similar to whom.

Basically, if we set number of group equal to 5, which matches the 5 marital status in our dataset, we could notice that single men and married men are far away from each other, while single women and married women are in the same group and the rest catagories are very close to each other on the top left corner.
What if we cluster on topics?
When we use KMeans on topics generated by LDA method to group our data into 7 subsets, it is not hard to see that centers are not evenly distributed, most of which are relatively close to each other. We could use this feature to infer that most topics in happy moment are not that much different and people are using very similar words to describe their feelings and experiences.

Summary
By doing text mining on HappyDB, I found some interesting facts about differences between men and wowen:
- Women are more likely to feel happy about their family than men do.
- Men are very serious about their job and career, we also spend a lot of time on sports and games.
- Single men and married men have huge differnece in their happy moments, while single or married to women are not that much different.
- Family is always the fountain of happiness for most people.
LS0tCnRpdGxlOiAnTWVuIGFuZCBXb21lbjogV2hhdCBNYWtlcyBZb3UgRmVlbCBIYXBweT8nClVOSTogdHcyNjY1Cm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZApBdXRob3I6IFRpYW5jaGVuIFdhbmcKLS0tCiFbXShmaWdzL2NvdmVyLnBuZykKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGVjaG89IEZBTFNFLCBlcnJvcj1GQUxTRX0KcGFja2FnZXMudXNlZCA9IGMoInRtIiwgImdncGxvdDIiLCAidGlkeXZlcnNlIiwgInRpZHl0ZXh0IiwKICAgICAgICAgICAgICAgICAgIndvcmRjbG91ZDIiLCJ0b3BpY21vZGVscyIsICJmYWN0b2V4dHJhIiwgCiAgICAgICAgICAgICAgICAgICJEVCIsICJodG1sd2lkZ2V0cyIsICJrYWJsZUV4dHJhIikKcGFja2FnZXMubmVlZGVkID0gc2V0ZGlmZihwYWNrYWdlcy51c2VkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3QoaW5zdGFsbGVkLnBhY2thZ2VzKClbLDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLnVzZWQpKQppZihsZW5ndGgocGFja2FnZS5uZWVkZWQpPjApewogIGluc3RhbGwucGFja2FnZXMocGFja2FnZXMubmVlZGVkLCBkZXBlbmRlbmNpZXMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgcmVwb3M9J2h0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmcnKQp9CmBgYAoKYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KcHJpbnQoUi52ZXJzaW9uKQpgYGAKCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CmxpYnJhcnkoRFQpCmxpYnJhcnkoc2hpbnkpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodG0pCmxpYnJhcnkod29yZGNsb3VkMikKbGlicmFyeSh0b3BpY21vZGVscykKbGlicmFyeShmYWN0b2V4dHJhKQpsaWJyYXJ5KGh0bWx3aWRnZXRzKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmBgYAoKIyMgV2hhdCBkb2VzIG91ciBkYXRhIGxvb2sgbGlrZT8KClRoZSBkYXRhIEkgdXNlZCBpbiB0aGUgcHJvamVjdCBpcyBmcm9tIFtIYXBweSBEQl0oaHR0cHM6Ly9yaXQtcHVibGljLmdpdGh1Yi5pby9IYXBweURCLyksIHdoaWNoIGNvbnRhaW5zIG1vcmUgdGhhbiAxMDAsMDAwIGhhcHB5IG1vbWVudHMgdGV4dCBkYXRhLiBIZXJlIGlzIGEgYnJpZWYgc3VtbWFyeSBvZiBvdXIgZGF0YXNldC4gSW4gYWRkaXRpb24gdG8gdGhlIHRleHQgZGF0YSwgaXQgaXMgYWxzbyBwb3NzaWJsZSBhbHNvIGdldCBtYW55IHVzZWZ1bCBpbmZvcm1hdGlvbiBzdWNoIGFzIGdlbmRlciwgbWFyaXRhbCBzdGF0dXMsIHJlZmxlY3Rpb24gcGVyaW9kIGFuZCBtb3JlLiBJbiB0aGlzIHByb2plY3QsIEkgd2lsbCBtYWlubHkgZm9jdXMgb24gdGhlIHNhbWUgcG9pbnRzIGFuZCBkaWZmZXJlbmNlcyBvZiBoYXBweSBtb21lbnRzIG9mIGRpZmZlcmVudCBnZW5kZXIuClRoZSBjaGFydCBiZWxvdyBpcyBhIHNtYWxsIHBpZWNlIG9mIG91ciBkYXRhc2V0IGFmdGVyIHJlb3JkZXJpbmcgY29sdW1ucy4KYGBge3Igd2FybmluZyA9IEZBTFNFLCBlY2hvPUZBTFNFfQpzZXR3ZCgifi9HaXQvU3ByaW5nMjAxOS1Qcm9qMS13YW5ndGNoNSIpCgpobV9kYXRhIDwtIHJlYWRfY3N2KCJvdXRwdXQvcHJvY2Vzc2VkX21vbWVudHMuY3N2IikKCnVybGZpbGUgPC0gJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yaXQtcHVibGljL0hhcHB5REIvbWFzdGVyL2hhcHB5ZGIvZGF0YS9kZW1vZ3JhcGhpYy5jc3YnCmRlbV9kYXRhIDwtIHJlYWRfY3N2KHVybGZpbGUpCgpuZXdfaG1fZGF0YSA8LSBtZXJnZShkZW1fZGF0YSwgaG1fZGF0YSwgYnkgPSAid2lkIiwgYWxsID0gRkFMU0UpCm5ld19obV9kYXRhIDwtIHVuaXF1ZShuZXdfaG1fZGF0YSkKbmV3X2htX2RhdGEgPC0gbmV3X2htX2RhdGFbYygxLDcsMTUsMiwzLDQsNSw2LDgsOSwxMCwxMSwxMiwxMywxNCwxNildICU+JQogIGZpbHRlcighKGdlbmRlcj09Im8iKSkKCmRhdGF0YWJsZShoZWFkKG5ld19obV9kYXRhKSxvcHRpb25zID0gbGlzdCgKICBhdXRvV2lkdGggPSBUUlVFLAogIGNvbHVtbkRlZnMgPSBsaXN0KGxpc3Qod2lkdGggPSAnMTAwcHgnLCB0YXJnZXRzID0gYygxLCAzKSkpCikpCgpgYGAKVGhpcyBpcyBhIGJyaWVmIHN0YXRpc3RpY3MgcmVwb3J0IG9mIHRoZSBkYXRhIEkgYW0gdHJ5aW5nIHRvIG1hbmlwdWxhdGUgd2l0aC4gVGhlIG51bWJlciBvZiBtYWxlIGlzIG1vcmUgdGhhbiBmZW1hbGUsIGFuZCBhbW9uZyBkaWZmZXJlbnQgbWFyaXRhbCBzdGF0dXMsIHRoZSB0d28gZG9taW5hdGUgY2xhc3NlcyBhcmUgbWFycmllZCBhbmQgc2luZ2xlLgpgYGB7ciwgZWNobz1GQUxTRX0Ka2FibGUoYWRkbWFyZ2lucyh0YWJsZShuZXdfaG1fZGF0YSRnZW5kZXIsIG5ld19obV9kYXRhJG1hcml0YWwpKSwgImh0bWwiKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCgpgYGB7ciwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0KZl9kYXRhIDwtIG5ld19obV9kYXRhW25ld19obV9kYXRhJGdlbmRlciA9PSAiZiIsXSAlPiUgZHJvcF9uYShwcmVkaWN0ZWRfY2F0ZWdvcnkpCm1fZGF0YSA8LSBuZXdfaG1fZGF0YVtuZXdfaG1fZGF0YSRnZW5kZXIgPT0gIm0iLF0gJT4lIGRyb3BfbmEocHJlZGljdGVkX2NhdGVnb3J5KQoKZl9kYXRhIDwtIGRyb3BfbmEoZl9kYXRhLCBtYXJpdGFsKQptX2RhdGEgPC0gZHJvcF9uYShtX2RhdGEsIG1hcml0YWwpCgp3cml0ZV9jc3YoZl9kYXRhLCAib3V0cHV0L2ZfZGF0YS5jc3YiKQp3cml0ZV9jc3YobV9kYXRhLCAib3V0cHV0L21fZGF0YS5jc3YiKQpgYGAKCiMjIFdoeSB3b21lbiBhbmQgbWVuIGFyZSBmZWVsaW5nIGhhcHB5PwoKQWNjb3JkaW5nIHRvIHRoZSBiYXJwbG90cywgd29tZW4gYXJlIG1vcmUgbGlrZWx5IHRvIGZlZWwgaGFwcHkgYWJvdXQgdGhpbmdzIHJlbGF0ZWQgdG8gYWZmZWN0aW9uIGFuZCBtZW4gYXJlIG1vcmUgd2lsbGluZyB0byBjaGVlciB0aGVpciBhY2hpZXZlbWVudHMuCmBgYHtyIGZlbWFsZSx3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsZmlnLndpZHRoID0gNCwgZmlnLmhlaWdodCA9IDJ9CiMjIyBwbG90IGFuZCBzYXZlIHBsb3RzIG9mIG1hbGUgYW5kIGZlYW1sZSBvbiBtYXJpdGFsIHN0YXR1cwpnZ3Bsb3QobmV3X2htX2RhdGEpKwogIGdlb21fYmFyKGFlcyh4ID0gcHJlZGljdGVkX2NhdGVnb3J5LCBmaWxsID0gcHJlZGljdGVkX2NhdGVnb3J5KSkgKyAKICBsYWJzKHRpdGxlID0gIlN1bW1hcnkgb2YgUHJlZGljdGVkIENhdGFnb3JpZXMiKSArCiAgZmFjZXRfd3JhcCh+Z2VuZGVyLCBzY2FsZXMgPSAiZnJlZSIpICsKICB4bGFiKGxhYmVsID0gTlVMTCkrCiAgdGhlbWVfYncoKSsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkKCiMgZ2dzYXZlKCJmaWdzL2Zfc3VtLnBuZyIpCiMgCiMgZ2dwbG90KG1fZGF0YSkrCiMgICBnZW9tX2JhcihhZXMoeCA9IHByZWRpY3RlZF9jYXRlZ29yeSwgZmlsbCA9IHByZWRpY3RlZF9jYXRlZ29yeSkpICsgCiMgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArIAojICAgbGFicyh0aXRsZSA9ICJTdW1tYXJ5IFN0YXRpc3RpY3Mgb2YgTWFsZSIpICsKIyAgIHhsYWIobGFiZWwgPSBOVUxMKSsKIyAgIHRoZW1lX2J3KCkKIyBnZ3NhdmUoImZpZ3MvbV9zdW0ucG5nIikKYGBgCgpCeSBjb21wYXJpbmcgdGhlIHR3byBtb3JlIGRldGFpbGVkIHBsb3RzLCBJIGZvdW5kIHNvbWV0aGluZyBpbnRlcmVzdGluZyBhYm91dCB0aGUgdGhpbmdzIHRoYXQgY2FuIGNoZWVyIG1lbiBhbmQgd29tZW4gdXAgaW4gdGhlaXIgZGlmZmVyZW50IG1hcml0YWwgc3RhdHVzLiBGb3IgZXhhbXBsZSwgbWFycmllZCBtZW4gYW5kIHNpbmdsZSBtZW4gaGF2ZSBodWdlIGRpZmZlcmVuY2UgaW4gdGhlaXIgaGFwcHkgbW9tZW50cywgc2luZ2xlIG1lbiBhcmUgaGFwcHkgYWJvdXQgYWNoaWV2ZW1lbnQgd2F5IG1vcmUgdGhhbiBhZmZlY3Rpb24sIGhvd2V2ZXIgb25jZSBtZW4gZ2V0dGluZyBtYXJyaWVkLCB0aGV5IG9idmlvdXNseSBzcGVuZCBtb3JlIHRpbWUgb24gZmFtaWx5IGFuZCBmZWVsIGhhcHB5IGFib3V0IGl0LiBPbmUgaW50ZXJlc3RpbmcgdGhpbmcgaXMgdGhhdCwgd29tZW4gYWx3YXlzIHdvdWxkIGxpa2UgdG8gc2hhcmUgb3IgZmVlbCBoYXBweSBhYm91dCB0aGluZ3MgcmVsYXRlZCB0byBhZmZlY3Rpb24gbm8gbWF0dGVyIHNoZSBpcyBzaW5nbGUgb3IgbWFycmllZC4gVGhvdWdoLCAgbWFycmllZCB3b21lbiBkbyBzcGVuZCBtdWNoIG1vcmUgdGltZSBvbiB0aGluZ3MgcmVsYXRlZCB0byBhZmZlY3Rpb24gdGhhbiBzaW5nbGUuIEFzIGZvciB3aWRvd2VkLCBzZXBhcmF0ZWQgYW5kIGRpdm9yY2VkIGZlbWFsZSBhbmQgbWFsZSwgYWZmZWN0aW9uIHBhcnQgaXMgdGhlIG1vc3Qgc2lnaW5pZmljYW50LgpgYGB7ciB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0UsZmlnLndpZHRoID0gNCwgZmlnLmhlaWdodCA9IDJ9CmdncGxvdChmX2RhdGEpKwogIGdlb21fYmFyKGFlcyh4ID0gcHJlZGljdGVkX2NhdGVnb3J5LCBmaWxsID0gcHJlZGljdGVkX2NhdGVnb3J5KSkgKyAKICBmYWNldF93cmFwKH5tYXJpdGFsLCBzY2FsZXMgPSAiZnJlZSIpKwogIHhsYWIobGFiZWwgPSBOVUxMKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnModGl0bGUgPSAiRmVtYWxlIikKIyBnZ3NhdmUoImZpZ3MvZi5wbmciKQoKZ2dwbG90KG1fZGF0YSkrCiAgZ2VvbV9iYXIoYWVzKHggPSBwcmVkaWN0ZWRfY2F0ZWdvcnksIGZpbGwgPSBwcmVkaWN0ZWRfY2F0ZWdvcnkpKSArIAogIGZhY2V0X3dyYXAofm1hcml0YWwsIHNjYWxlcyA9ICJmcmVlIikrCiAgeGxhYihsYWJlbCA9IE5VTEwpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh0aXRsZSA9ICJNYWxlIikKIyBnZ3NhdmUoImZpZ3MvbS5wbmciKQoKYGBgCgojIyBXaGF0IHdvcmRzIGRvIHRoZXkgdXNlPwpgYGB7ciB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQptZWFuaW5nbGVzc193b3JkcyA8LSBjKCJkYXkiLCAidGltZSIsICJmaW5hbGx5IiwgImZhdm9yaXRlIiwgIm5pY2UiLCAiYWEiLCAncnMnLCAiZGlkbnQiLCAiaGFkbnQiKQojICJlbmpveWVkIiwgImZlZWwiLCAid2F0Y2hlZCIsICJwbGF5ZWQiCmBgYAoKYGBge3IsZWNobz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KZl9iYWdfb2Zfd29yZHMgPC0gYXNfdGliYmxlKGZfZGF0YSR0ZXh0KSAlPiUgCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB2YWx1ZSkKCmZfd29yZF9jb3VudCA8LSBmX2JhZ19vZl93b3JkcyAlPiUKICBjb3VudCh3b3JkLCBzb3J0ID0gVFJVRSkgJT4lCiAgZmlsdGVyKCEod29yZCAlaW4lIG1lYW5pbmdsZXNzX3dvcmRzKSkKCm1fYmFnX29mX3dvcmRzIDwtIGFzX3RpYmJsZShtX2RhdGEkdGV4dCkgJT4lIAogIHVubmVzdF90b2tlbnMod29yZCwgdmFsdWUpCgptX3dvcmRfY291bnQgPC0gbV9iYWdfb2Zfd29yZHMgJT4lCiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpICU+JQogIGZpbHRlcighKHdvcmQgJWluJSBtZWFuaW5nbGVzc193b3JkcykpCgp3Y2YgPC0gd29yZGNsb3VkMihmX3dvcmRfY291bnQsIAogICAgICAgICAgIGNvbG9yID0gInJhbmRvbS1kYXJrIiwKICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSAiQmxhY2siKQpzYXZlV2lkZ2V0KHdjZiwid2NmLmh0bWwiLHNlbGZjb250YWluZWQgPSBGKQoKd2NtIDwtIHdvcmRjbG91ZDIobV93b3JkX2NvdW50LCAKICAgICAgICAgICBjb2xvciA9ICJyYW5kb20tZGFyayIsCiAgICAgICAgICAgc2hhcGUgPSAic3F1YXJlIiwKICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IgPSAiQmxhY2siKQpzYXZlV2lkZ2V0KHdjbSwid2NtLmh0bWwiLHNlbGZjb250YWluZWQgPSBGKQpgYGAKSW4gb3JkZXIgdG8gZ2V0IGEgYnJpZWYgc2Vuc2Ugb2Ygd2hhdCB3b21lbiBhbmQgbWVuIGFyZSBzYXlpbmcgaW4gdGhlaXIgaGFwcHkgbW9tZW50cywgSSBkcmF3IDIgd29yZCBjbG91ZCBmaWd1cmVzIHRvIG1ha2UgdGhpbmdzIGNsZWFyLgpIZXJlLCB3b3JkIGNhcGl0YWwgd29yZCAiRiIgcmVwcmVzZW50cyBmZW1hbGUgYW5kICJNIiByZXByZXNlbnRzIG1hbGUuCkJ5IGxvb2tpbmcgYXQgdGhlIHdvcmQgY2xvdWQgb2Ygd29tZW4sIGl0IGlzIGVhc3kgdG8gbm90aWNlIHRoYXQgdGhlcmUgYXJlIGxvdHMgb2Ygd29yZHMgcmVsYXRlZCB0byBmYW1pbHkgYW5kIGxpZmUuCmBgYHtyIGVjaG89RkFMU0V9CmxldHRlckNsb3VkKGZfd29yZF9jb3VudCwgIkYiLCB3b3JkU2l6ZT0zKQpgYGAKIVtdKGZpZ3MvZm0uanBnKQpUaGUgbW9zdCB1c2VkIHdvcmRzIGluIG1lbidzIGhhcHB5IG1vbWVudCBhcmUgbm90IHNvIGZvY3VzZWQgb24gZmFtaWx5IG1hdHRlcnMuIFRoZXJlIGFyZSBtb3JlIHdvcmRzIHJlbGF0ZWQgdG8gZ2FtZSBhbmQgb2NjdXBhdGlvbi4KYGBge3IgZWNobz1GQUxTRX0KbGV0dGVyQ2xvdWQobV93b3JkX2NvdW50LCAiTSIsIHdvcmRTaXplPTMpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBkZWFsIHdpdGggd29yZHMgYW5kIHRmLWlkZgpmX3dvcmRzIDwtIGZfZGF0YSAlPiUgCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJuZ3JhbXMiLCBuID0gMSkgJT4lCiAgY291bnQobWFyaXRhbCwgd29yZCwgc29ydCA9IFRSVUUpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgZmlsdGVyKCEod29yZCAlaW4lIG1lYW5pbmdsZXNzX3dvcmRzKSkKICAKZl90ZmlkZiA8LSBmX3dvcmRzICU+JQogIGJpbmRfdGZfaWRmKHdvcmQsIG1hcml0YWwsIG4pCgptX3dvcmRzIDwtIG1fZGF0YSAlPiUgCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0LCB0b2tlbiA9ICJuZ3JhbXMiLCBuID0gMSkgJT4lCiAgY291bnQobWFyaXRhbCwgd29yZCwgc29ydCA9IFRSVUUpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgZmlsdGVyKCEod29yZCAlaW4lIG1lYW5pbmdsZXNzX3dvcmRzKSkKCm1fdGZpZGYgPC0gbV93b3JkcyAlPiUKICBiaW5kX3RmX2lkZih3b3JkLCBtYXJpdGFsLCBuKQoKd3JpdGVfY3N2KGZfdGZpZGYsICdvdXRwdXQvZl90ZmlkZi5jc3YnKQp3cml0ZV9jc3YobV90ZmlkZiwgJ291dHB1dC9tX3RmaWRmLmNzdicpCgpgYGAKCiMjIERvZXMgbWFyaXRhbCBzdGF0dXMgYWZmZWN0IHRoZSB3YXkgbWVuIGFuZCB3b21lbiBmZWVsIGhhcHB5PwoKSSBtYWRlIHRoZSB3b3JkIGZyZXF1ZW5jZSBwbG90cyBhbmQgdGZpZGYgcGxvdHMgdG8gc2hvdyB3aGV0aGVyIG1hcml0YWwgc3RhdHVzIGhhcyBhbnkgZWZmZWN0IG9uIGhhcHB5IG1vbWVudC4KYGBge3IgdGZpZGYsIHdhcm5pbmc9RkFMU0UsZWNobz1GQUxTRSwgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9NH0KIyBPTiBNQVJJVEFMIFNUQVRVUwpkZiA8LSBmX3dvcmRzICU+JQogIGdyb3VwX2J5KG1hcml0YWwpICU+JQogIGRpc3RpbmN0KG4sLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgdG9wX24oMTAsIG4pICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKG1hcml0YWwsIG4pICU+JQogIG11dGF0ZShvcmRlciA9IHJvd19udW1iZXIoKSkKICAKZ2dwbG90KGRmLCBhZXMob3JkZXIsIG4sIGZpbGwgPSBtYXJpdGFsKSkgKwogIGdlb21fY29sKHNob3cubGVnZW5kID0gRkFMU0UpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gIm4iLCB0aXRsZSA9ICJGZW1hbGUgV29yZCIpICsKICBmYWNldF93cmFwKH5tYXJpdGFsLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGRmJG9yZGVyLCBsYWJlbHMgPSBkZiR3b3JkKSArCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lX2J3KCkKIyMKZGYgPC0gZl90ZmlkZiAlPiUKICBncm91cF9ieShtYXJpdGFsKSAlPiUKICBkaXN0aW5jdCh0Zl9pZGYsLmtlZXBfYWxsID0gVFJVRSkgJT4lCiAgdG9wX24oMTAsIHRmX2lkZikgJT4lCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UobWFyaXRhbCwgdGZfaWRmKSAlPiUKICBtdXRhdGUob3JkZXIgPSByb3dfbnVtYmVyKCkpCgpnZ3Bsb3QoZGYsIGFlcyhvcmRlciwgdGZfaWRmLCBmaWxsID0gbWFyaXRhbCkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJ0Zi1pZGYiLCB0aXRsZSA9ICJGZW1hbGUgVEYtSURGIikgKwogIGZhY2V0X3dyYXAofm1hcml0YWwsIG5jb2wgPSAyLCBzY2FsZXMgPSAiZnJlZSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gZGYkb3JkZXIsIGxhYmVscyA9IGRmJHdvcmQpICsKICBjb29yZF9mbGlwKCkrCiAgdGhlbWVfYncoKQpgYGAKYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTMsIGZpZy5oZWlnaHQ9NH0KIyMKZGYgPC0gbV93b3JkcyAlPiUKICBncm91cF9ieShtYXJpdGFsKSAlPiUKICBkaXN0aW5jdChuLC5rZWVwX2FsbCA9IFRSVUUpICU+JQogIHRvcF9uKDEwLCBuKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgYXJyYW5nZShtYXJpdGFsLCBuKSAlPiUKICBtdXRhdGUob3JkZXIgPSByb3dfbnVtYmVyKCkpCgpnZ3Bsb3QoZGYsIGFlcyhvcmRlciwgbiwgZmlsbCA9IG1hcml0YWwpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAibiIsIHRpdGxlID0gIk1hbGUgV29yZCIpICsKICBmYWNldF93cmFwKH5tYXJpdGFsLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGRmJG9yZGVyLCBsYWJlbHMgPSBkZiR3b3JkKSArCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lX2J3KCkKIyMgCmRmIDwtIG1fdGZpZGYgJT4lCiAgZ3JvdXBfYnkobWFyaXRhbCkgJT4lCiAgZGlzdGluY3QodGZfaWRmLC5rZWVwX2FsbCA9IFRSVUUpICU+JQogIHRvcF9uKDEwLCB0Zl9pZGYpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKG1hcml0YWwsIHRmX2lkZikgJT4lCiAgbXV0YXRlKG9yZGVyID0gcm93X251bWJlcigpKQogICMgbXV0YXRlKHdvcmQgPSByZW9yZGVyKHdvcmQsIHRmX2lkZikpICU+JQpnZ3Bsb3QoZGYsIGFlcyhvcmRlciwgdGZfaWRmLCBmaWxsID0gbWFyaXRhbCkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJ0Zi1pZGYiLCB0aXRsZSA9ICJNYWxlIFRGLUlERiIpICsKICBmYWNldF93cmFwKH5tYXJpdGFsLCBuY29sID0gMiwgc2NhbGVzID0gImZyZWUiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGRmJG9yZGVyLCBsYWJlbHMgPSBkZiR3b3JkKSArCiAgY29vcmRfZmxpcCgpKwogIHRoZW1lX2J3KCkKCiMgZ2dzYXZlKCdmaWdzL2Zfd29yZHMucG5nJykKIyBnZ3NhdmUoJ2ZpZ3MvZl90ZmlkZi5wbmcnKQojIGdnc2F2ZSgnZmlncy9tX3dvcmRzLnBuZycpCiMgZ2dzYXZlKCdmaWdzL21fdGZpZGYucG5nJykKCmBgYAoKIyMgV2hhdCBhcmUgdGhleSBmZWVsaW5nIGhhcHB5IGFib3V0PwoKVGhlIHRvcGljIG51bWJlcnMgSSBwdXQgaW50byBbTERBXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYXRlbnRfRGlyaWNobGV0X2FsbG9jYXRpb24pIGlzIEs9MjEuIFRoZSByZWFzb24gd2h5IEkgY2hvb3NlIHRoaXMgbnVtYmVyIGlzIHRoYXQgd2UgYWxyZWFkeSBoYXZlIHNldmVuIHJvdWdoIGNhdGFnb3JpZXMgaW4gdGhlIGRhdGFzZXQgYW5kIEkgc3VwcG9zZSB0aGF0IHRoZXJlIHdpbGwgYmUgMyBzdWJ0bGUgY2F0YWdvcmllcyBpbiBlYWNoIHJvdWdoIGNhdGFnb3J5LCB0aGVuIHRoZSB0b3RhbCBudW1iZXIgb2YgdG9waWNzIHdvdWxkIGJlIDIxLgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpmX2NvcnB1cyA8LSBDb3JwdXMoRGF0YWZyYW1lU291cmNlKHNlbGVjdChmX2RhdGEsIGRvY19pZCA9IGhtaWQsIHRleHQpKSkKZl9kdG0gPC0gRG9jdW1lbnRUZXJtTWF0cml4KGZfY29ycHVzKQpyb3dzVG90YWwgPC0gYXBwbHkoZl9kdG0gLCAxLCBzdW0pCmZfZHRtIDwtIGZfZHRtW3Jvd3NUb3RhbD4wLCBdCgptX2NvcnB1cyA8LSBDb3JwdXMoRGF0YWZyYW1lU291cmNlKHNlbGVjdChtX2RhdGEsIGRvY19pZCA9IGhtaWQsIHRleHQpKSkKbV9kdG0gPC0gRG9jdW1lbnRUZXJtTWF0cml4KG1fY29ycHVzKQpyb3dzVG90YWwgPC0gYXBwbHkobV9kdG0gLCAxLCBzdW0pCm1fZHRtIDwtIG1fZHRtW3Jvd3NUb3RhbD4wLCBdCgpzZWVkIDwtIGxpc3QoMjAxOSwyLDEsMTAsMjUpCksgPSA3KjMKY29udHJvbCA8LSBsaXN0KG5zdGFydD01LCBidXJuaW49NTAwLCBpdGVyPTIwMDAsIHRoaW49MjAwLCAKICAgICAgICAgICAgICAgIGJlc3Q9VFJVRSwgc2VlZD1zZWVkKQoKZl9sZGEgPC0gTERBKGZfZHRtLCBLLCBtZXRob2QgPSAiR2liYnMiLCBjb250cm9sID0gY29udHJvbCkKZl90b3BpYyA8LSB0aWR5KGZfbGRhLCBtYXRyaXggPSAiYmV0YSIpCndyaXRlX2NzdihmX3RvcGljLCAib3V0cHV0L2ZfdG9waWNzLmNzdiIpCgptX2xkYSA8LSBMREEobV9kdG0sIEssIG1ldGhvZCA9ICJHaWJicyIsIGNvbnRyb2wgPSBjb250cm9sKQptX3RvcGljIDwtIHRpZHkobV9sZGEsIG1hdHJpeCA9ICJiZXRhIikKd3JpdGVfY3N2KG1fdG9waWMsICJvdXRwdXQvbV90b3BpY3MuY3N2IikKCmBgYAoKYGBge3IgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0KZl90b3BfdGVybXMgPC0gZl90b3BpYyAlPiUKICBncm91cF9ieSh0b3BpYykgJT4lCiAgdG9wX24oMTAsIGJldGEpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKHRvcGljLCAtYmV0YSkKCmZfdG9wX3Rlcm1zICU+JQogIG11dGF0ZSh0ZXJtID0gcmVvcmRlcih0ZXJtLCBiZXRhKSkgJT4lCiAgZ2dwbG90KGFlcyh0ZXJtLCBiZXRhLCBmaWxsID0gZmFjdG9yKHRvcGljKSkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZmFjZXRfd3JhcCh+IHRvcGljLCBzY2FsZXMgPSAiZnJlZSIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIAogIGxhYnModGl0bGUgPSAiRmVtYWxlIFRvcGljcyIsIHggPSBOVUxMKQojIGdnc2F2ZSgnZmlncy9mX3RvcGljcy5wbmcnKQoKbV90b3BfdGVybXMgPC0gbV90b3BpYyAlPiUKICBncm91cF9ieSh0b3BpYykgJT4lCiAgdG9wX24oMTAsIGJldGEpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKHRvcGljLCAtYmV0YSkKCm1fdG9wX3Rlcm1zICU+JQogIG11dGF0ZSh0ZXJtID0gcmVvcmRlcih0ZXJtLCBiZXRhKSkgJT4lCiAgZ2dwbG90KGFlcyh0ZXJtLCBiZXRhLCBmaWxsID0gZmFjdG9yKHRvcGljKSkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZmFjZXRfd3JhcCh+IHRvcGljLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyAKICBjb29yZF9mbGlwKCkgKwogIGxhYnModGl0bGUgPSAiTWFsZSBUb3BpY3MiLCB4ID0gTlVMTCkKIyBnZ3NhdmUoJ2ZpZ3MvbV90b3BpY3MucG5nJykKIApgYGAKVGhlcmUgYXJlIHNvbWUgaW50ZXJlc3RpbmcgcG9pbnRzLCBpbiBtYWxlIHRvcGljIDYsIDcgYW5kIDggYXJlIGFib3V0IGdhbWUsIGV4ZXJjaXNlIGFuZCBqb2IsIHdoaWNoIGFueSBvZiB0aGVzZSB0b3BpY3MgYXJlIGhhcmQgdG8gbWF0Y2ggaW4gZmVtYWxlIHRvcGljcy4KSW4gbWFsZSB0b3BpYyAxMSBhbmQgMTMsIHdvcmRzIHNob3cgdGhhdCB0aGluZ3MgYXJlIHJlbGF0ZWQgdG8gc2Nob29sIGFuZCB3b3JrLCB3aGljaCBjb3VsZCBtYXRjaCBmZW1hbGUgdG9waWMgMTIgYW5kIDE1LiBXb21lbiBhcmUgbW9yZSBsaWtlbHkgdG8gaGF2ZSBoYXBweSBtb21lbnRzIHdpdGggZmFtaWx5LCBhbmQgdGhleSBhcmUgbW9yZSBzZW5zZXRpdmUgdG8gdGhlICJzbWFsbCIgdGhpbmdzIGhhcHBlbmVkIGluIHRoZWlyIGxpZmUuIENvbXBhcmVkIHRvIHdvbWVuLCBtZW4gYXJlIG5vdCB0aGF0IG11Y2ggbGlrZSB0byBmZWVsLCBvciBhdCBsZWFzdCB0byBzaGFyZSB0aGVpciBoYXBweSBtb21lbnRzIHdpdGggZmFtaWx5LiBOb3QgbGlrZSB3b21lbiwgbWVuIGFyZSBtb3JlIGxpa2VseSB0byBmZWVsIGhhcHB5IGFib3V0IHRoZWlyIGpvYiwgc2Nob29sIGFuZCBleGVyY2lzZSBpbiBneW0gKGFjaGlldmVtZW50cykuCgojIyBXaG8gaXMgc2ltaWxhciB0byB3aG9tPwoKQWZ0ZXIgYWxsIHRoZSBhbmFseXNpcyBvZiBkaWZmZXJlbmNlIGJldHdlZW4gbWVuIGFuZCB3b21lbiwgSSBjYW4gbm93IHVzZSBjbHVzdGVyaW5nIG1ldGhvZCB0byBzZWUgaWYgYW1vbmcgYWxsIHRoZSBtYXJpdGFsIHN0YXR1cyBvZiBtZW4gYW5kIHdvbWVuLCB3aG8gaXMgc2ltaWxhciB0byB3aG9tLgpgYGB7ciBlY2hvPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpobV9kdG0gPC0gbmV3X2htX2RhdGEgJT4lCiAgc2VsZWN0KG1hcml0YWwsIGdlbmRlcix0ZXh0KSAlPiUKICBncm91cF9ieShtYXJpdGFsLCBnZW5kZXIpICU+JQogIHN1bW1hcmlzZSh0ZXh0ID0gcGFzdGUodGV4dCxjb2xsYXBzZSA9ICIiKSkgJT4lCiAgZHJvcF9uYSgpICU+JQogIGZpbHRlcihnZW5kZXIgIT0gIm8iKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGRvY19pZCA9IHBhc3RlMChtYXJpdGFsLCdfJyxnZW5kZXIpKSAlPiUKICBzZWxlY3QoZG9jX2lkLCB0ZXh0KQoKaG1fZHRtIDwtIERvY3VtZW50VGVybU1hdHJpeChWQ29ycHVzKERhdGFmcmFtZVNvdXJjZShobV9kdG0pKSkKCmR0bV9rbV9yZXMgPC0ga21lYW5zKGhtX2R0bSwgNSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFfQpmdml6X2NsdXN0ZXIoZHRtX2ttX3JlcywgCiAgICAgICAgICAgICBzdGFuZD1ULCByZXBlbD0gVFJVRSwKICAgICAgICAgICAgIGRhdGEgPSBobV9kdG0sCiAgICAgICAgICAgICBzaG93LmNsdXN0LmNlbnQ9RkFMU0UsCiAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbGlnaHQoKSkKYGBgCkJhc2ljYWxseSwgaWYgd2Ugc2V0IG51bWJlciBvZiBncm91cCBlcXVhbCB0byA1LCB3aGljaCBtYXRjaGVzIHRoZSA1IG1hcml0YWwgc3RhdHVzIGluIG91ciBkYXRhc2V0LCB3ZSBjb3VsZCBub3RpY2UgdGhhdCBzaW5nbGUgbWVuIGFuZCBtYXJyaWVkIG1lbiBhcmUgZmFyIGF3YXkgZnJvbSBlYWNoIG90aGVyLCB3aGlsZSBzaW5nbGUgd29tZW4gYW5kIG1hcnJpZWQgd29tZW4gYXJlIGluIHRoZSBzYW1lIGdyb3VwIGFuZCB0aGUgcmVzdCBjYXRhZ29yaWVzIGFyZSB2ZXJ5IGNsb3NlIHRvIGVhY2ggb3RoZXIgb24gdGhlIHRvcCBsZWZ0IGNvcm5lci4KCiMjIFdoYXQgaWYgd2UgY2x1c3RlciBvbiB0b3BpY3M/CgpXaGVuIHdlIHVzZSBbS01lYW5zXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9LLW1lYW5zX2NsdXN0ZXJpbmcpIG9uIHRvcGljcyBnZW5lcmF0ZWQgYnkgTERBIG1ldGhvZCB0byBncm91cCBvdXIgZGF0YSBpbnRvIDcgc3Vic2V0cywgaXQgaXMgbm90IGhhcmQgdG8gc2VlIHRoYXQgY2VudGVycyBhcmUgbm90IGV2ZW5seSBkaXN0cmlidXRlZCwgbW9zdCBvZiB3aGljaCBhcmUgcmVsYXRpdmVseSBjbG9zZSB0byBlYWNoIG90aGVyLiBXZSBjb3VsZCB1c2UgdGhpcyBmZWF0dXJlIHRvIGluZmVyIHRoYXQgbW9zdCB0b3BpY3MgaW4gaGFwcHkgbW9tZW50IGFyZSBub3QgdGhhdCBtdWNoIGRpZmZlcmVudCBhbmQgcGVvcGxlIGFyZSB1c2luZyB2ZXJ5IHNpbWlsYXIgd29yZHMgdG8gZGVzY3JpYmUgdGhlaXIgZmVlbGluZ3MgYW5kIGV4cGVyaWVuY2VzLiAKYGBge3IgZWNobz1GQUxTRX0KZl90b3BpY19kdG0gPC0gZl90b3BpYyAlPiUKICBncm91cF9ieSh0b3BpYykgJT4lCiAgYXJyYW5nZSh0b3BpYywgLWJldGEpICU+JQogIHRvcF9uKDcwKSAlPiUKICBzdW1tYXJpc2UodGV4dCA9IHBhc3RlKHRlcm0sIHNlcCA9ICIgIixjb2xsYXBzZSA9ICIgIikpICU+JQogIGRyb3BfbmEoKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKGRvY19pZCA9IHBhc3RlMCh0b3BpYywnX2YnKSkKCm1fdG9waWNfZHRtIDwtIG1fdG9waWMgJT4lCiAgZ3JvdXBfYnkodG9waWMpICU+JQogIGFycmFuZ2UodG9waWMsIC1iZXRhKSAlPiUKICB0b3Bfbig3MCkgJT4lCiAgc3VtbWFyaXNlKHRleHQgPSBwYXN0ZSh0ZXJtLCBzZXAgPSAiICIsY29sbGFwc2UgPSAiICIpKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZShkb2NfaWQgPSBwYXN0ZTAodG9waWMsJ19tJykpCgp0b3BpY19kdG0gPC0gYmluZF9yb3dzKGZfdG9waWNfZHRtLCBtX3RvcGljX2R0bSkgJT4lCiAgc2VsZWN0KGRvY19pZCwgdGV4dCkgJT4lCiAgRGF0YWZyYW1lU291cmNlKCkgJT4lCiAgVkNvcnB1cygpICU+JQogIERvY3VtZW50VGVybU1hdHJpeCgpCgp0cF9rbV9yZXMgPC0ga21lYW5zKHRvcGljX2R0bSwgNSkKc29ydCh0cF9rbV9yZXMkY2x1c3RlcikKdGFibGUodHBfa21fcmVzJGNsdXN0ZXIpCgpgYGAKCmBgYHtyIGVjaG89RkFMU0V9CmZ2aXpfY2x1c3Rlcih0cF9rbV9yZXMsIAogICAgICAgICAgICAgc3RhbmQ9VCwgcmVwZWw9IFRSVUUsCiAgICAgICAgICAgICBkYXRhID0gdG9waWNfZHRtLAogICAgICAgICAgICAgc2hvdy5jbHVzdC5jZW50PUZBTFNFLAogICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX2xpZ2h0KCkpCmBgYAoKIyMgU3VtbWFyeQoKQnkgZG9pbmcgdGV4dCBtaW5pbmcgb24gSGFwcHlEQiwgSSBmb3VuZCBzb21lIGludGVyZXN0aW5nIGZhY3RzIGFib3V0IGRpZmZlcmVuY2VzIGJldHdlZW4gbWVuIGFuZCB3b3dlbjoKCi0gV29tZW4gYXJlIG1vcmUgbGlrZWx5IHRvIGZlZWwgaGFwcHkgYWJvdXQgdGhlaXIgZmFtaWx5IHRoYW4gbWVuIGRvLgotIE1lbiBhcmUgdmVyeSBzZXJpb3VzIGFib3V0IHRoZWlyIGpvYiBhbmQgY2FyZWVyLCB3ZSBhbHNvIHNwZW5kIGEgbG90IG9mIHRpbWUgb24gc3BvcnRzIGFuZCBnYW1lcy4KLSBTaW5nbGUgbWVuIGFuZCBtYXJyaWVkIG1lbiBoYXZlIGh1Z2UgZGlmZmVybmVjZSBpbiB0aGVpciBoYXBweSBtb21lbnRzLCB3aGlsZSBzaW5nbGUgb3IgbWFycmllZCB0byB3b21lbiBhcmUgbm90IHRoYXQgbXVjaCBkaWZmZXJlbnQuCi0gRmFtaWx5IGlzIGFsd2F5cyB0aGUgZm91bnRhaW4gb2YgaGFwcGluZXNzIGZvciBtb3N0IHBlb3BsZS4KCiMjIFJlZmVyZW5jZSAKPiBbR2VuZGVyIERpZmZlcmVuY2VzIGluIEdyYXRpdHVkZTogRXhhbWluaW5nIEFwcHJhaXNhbHMsIE5hcnJhdGl2ZXMsIHRoZSBXaWxsaW5nbmVzcyB0byBFeHByZXNzIEVtb3Rpb25zLCBhbmQgQ2hhbmdlcyBpbiBQc3ljaG9sb2dpY2FsIE5lZWRzLiBUb2RkIEIuS2FzaGRhbiwgQW5qYWxpIE1pc2hyYSwgV2lsbGlhbSBFLiBCcmVlbiwgYW5kIEplZmZyZXkgSi4gRnJvaF0oaHR0cDovL21hc29uLmdtdS5lZHUvfnRrYXNoZGFuL3B1YmxpY2F0aW9ucy9ncmF0aXR1ZGVfZ2VuZGVyZGlmZl9KUC5wZGYp